<?php
/*
	使用方法

	可以使用2个文件代表 M (xx.inc.php) 和 V (xx.tpl.php)

	$pTpl = & new Template('模板文件路径');
	$pTpl->set('var', '设置变量'); // 必须至少设置一个变量
	echo $pTpl->fetch('模板文件.tpl.php');
*/
/**
 * 模板类
 */
Class Template
{
	/**
	 * 变量数组
	 */
	var $vars;

	/**
	 * 模板路径
	 */
	var $path;

	/**
	 * 初始化模板路径
	 */
	function Template($path = null)
	{
		$this->path = $path;
	}

	/**
	 * 设置模板路径
	 */
	function set_path($path)
	{
		$this->path = $path;
	}

	/**
	 * 设置变量
	 */
	function set($name, $value)
	{
		$this->vars[$name] = $value;
	}

	/**
	 * 获取模板文件
	 */
	function fetch($file)
	{
		// global $GA;
		// global 全局变量  如果tpl文件需要使用全局变量 如 全局数组  需要 global 全局变量

		extract($this->vars);
		ob_start();
		include($this->path.$file);
		$contents = ob_get_contents();
		ob_end_clean();
		return $contents;
	}
}

/**
 * 缓存类
 */
Class CachedTemplate extends Template
{
	var $cache_id;
	var $expire;
	var $cached;

	function CachedTemplate($path, $cache_id = null, $expire = 900)
	{
		$this->Template($path);
		$this->cache_id = $cache_id ? 'cache/' . md5($cache_id) : $cache_id;
		$this->expire   = $expire;
	}
	function is_cached()
	{
		if($this->cached) return true;

		if(!$this->cache_id) return false;

		if(!file_exists($this->cache_id)) return false;

		if(!($mtime = filemtime($this->cache_id))) return false;

		if(($mtime + $this->expire) < time())
		{
			@unlink($this->cache_id);
			return false;
		}
		else
		{
			$this->cached = true;
			return true;
		}
	}
	function fetch_cache($file)
	{
		if($this->is_cached())
		{
			$fp = @fopen($this->cache_id, 'r');
			$contents = fread($fp, filesize($this->cache_id));
			fclose($fp);
			return $contents;
		}
		else
		{
			$contents = $this->fetch($file);

			if($fp = @fopen($this->cache_id, 'w'))
			{
				fwrite($fp, $contents);
				fclose($fp);
			}
			else
			{
				die('Unable to write cache.');
			}

			return $contents;
		}
	}
}